/*-------------------------------------------------------------------------
 *
 * regexport.h
 *	  针对 regex 的 NFA（非确定性有限状态机）导出信息的声明
 *
 * 此处声明的函数提供访问器，用于提取成功编译的 regex 的 NFA 状态图
 * 和颜色字符集。
 *
 * NFA 包含一个或多个状态，编号为 0..N-1。存在一个初始
 * 状态，以及一个最终状态——到达最终状态表示成功匹配输入字符串。每个状态（最终状态除外）
 * 具有一些外弧，指向后续状态，每个弧通过一个表示一种或多种具体字符代码的颜色进行标记。
 * （状态的外弧的颜色不需要是不同的，因为这是 NFA，而不是 DFA。）还有表示行首/行尾
 * 和字符串开始/结束的“伪颜色”。颜色编号为 0..C-1，但请注意，颜色 0 是“白色”（所有未使用的字符），
 * 通常可以忽略。
 *
 * Portions Copyright (c) 2013-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1998, 1999 Henry Spencer
 *
 * IDENTIFICATION
 *	  src/include/regex/regexport.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef _REGEXPORT_H_
#define _REGEXPORT_H_

#include "regex/regex.h"

/* 这些宏必须与 regguts.h 中的对应宏匹配： */
#define COLOR_WHITE		0		/* 不出现在 regex 中的字符颜色 */
#define COLOR_RAINBOW	(-2)	/* 代表所有颜色，除了伪颜色 */

/* 关于正则表达式NFA的一个弧的信息 */
typedef struct
{
	int			co;				/* 弧的标签（字符集颜色） */
	int			to;				/* 下一个状态编号 */
} regex_arc_t;


/* 收集有关NFA状态和弧的信息的函数 */
extern int	pg_reg_getnumstates(const regex_t *regex);
extern int	pg_reg_getinitialstate(const regex_t *regex);
extern int	pg_reg_getfinalstate(const regex_t *regex);
extern int	pg_reg_getnumoutarcs(const regex_t *regex, int st);
extern void pg_reg_getoutarcs(const regex_t *regex, int st,
							  regex_arc_t *arcs, int arcs_len);

/* 用于收集有关颜色的信息的函数 */
extern int	pg_reg_getnumcolors(const regex_t *regex);
extern int	pg_reg_colorisbegin(const regex_t *regex, int co);
extern int	pg_reg_colorisend(const regex_t *regex, int co);
extern int	pg_reg_getnumcharacters(const regex_t *regex, int co);
extern void pg_reg_getcharacters(const regex_t *regex, int co,
								 pg_wchar *chars, int chars_len);

#endif							/* _REGEXPORT_H_ */
